package com.example.stuwork.dao;

import com.example.stuwork.pojo.QuizSubmission;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * 测试提交数据访问接口
 */
@Repository
public interface QuizSubmissionDao {
    
    /**
     * 查询所有提交记录
     * 
     * @return 提交记录列表
     */
    List<QuizSubmission> findAll();
    
    /**
     * 根据ID查询提交记录
     * 
     * @param submissionId 提交记录ID
     * @return 提交记录信息
     */
    QuizSubmission getById(Long submissionId);
    
    /**
     * 根据测试ID查询所有提交记录
     * 
     * @param quizId 测试ID
     * @return 提交记录列表
     */
    List<QuizSubmission> findByQuizId(Long quizId);
    
    /**
     * 根据学生ID查询所有提交记录
     * 
     * @param studentId 学生ID
     * @return 提交记录列表
     */
    List<QuizSubmission> findByStudentId(String studentId);
    
    /**
     * 根据测试ID和学生ID查询提交记录
     * 
     * @param quizId 测试ID
     * @param studentId 学生ID
     * @return 提交记录信息
     */
    QuizSubmission findByQuizIdAndStudentId(@Param("quizId") Long quizId, @Param("studentId") String studentId);
    
    /**
     * 添加提交记录
     * 
     * @param submission 提交记录信息
     * @return 影响行数
     */
    int insert(QuizSubmission submission);
    
    /**
     * 更新提交记录信息
     * 
     * @param submission 提交记录信息
     * @return 影响行数
     */
    int update(QuizSubmission submission);
    
    /**
     * 删除提交记录
     * 
     * @param submissionId 提交记录ID
     * @return 影响行数
     */
    int deleteById(Long submissionId);
    
    /**
     * 根据测试ID删除所有提交记录
     * 
     * @param quizId 测试ID
     * @return 影响行数
     */
    int deleteByQuizId(Long quizId);
    
    /**
     * 计算提交记录的得分
     * 
     * @param submissionId 提交记录ID
     * @return 更新后的记录数
     */
    int calculateScore(Long submissionId);
    
    /**
     * 统计测试的提交人数
     * 
     * @param quizId 测试ID
     * @return 提交人数
     */
    int countSubmissionsByQuizId(Long quizId);
    
    /**
     * 获取测试的提交统计信息
     * 
     * @param quizId 测试ID
     * @return 统计信息
     */
    Map<String, Object> getQuizSubmissionStats(Long quizId);
    
    /**
     * 查询学生是否已提交测试
     * 
     * @param quizId 测试ID
     * @param studentId 学生ID
     * @return 是否已提交
     */
    boolean isSubmitted(@Param("quizId") Long quizId, @Param("studentId") String studentId);
} 